# -*- coding: utf-8 -*- 
# 姓名：李万伦
# 时间：2023/5/16  21:14
# 文件名：logging_function.py
# 1.日志等级:
# DEBUG	调试模式下的日志，只给程序员看的日志
# INFO	程序正常运行的时候输出的日志
# WARN/WARNING	警告信息，当前程序还可以运行，后面有可能出现问题
# ERROR	程序执行过程总的错误信息
# CRITICAL	发生严重错误，阻塞流程，程序可能无法继续运行
# 2.日志等级调用方法：
# logging.debug("调试日志信息")
# logging.info("重要日志信息")
# logging.warning("警告日志信息")
# logging.error("错误日志信息")
# logging.critical("致命日志信息")
# 3.日志收集器：
# log = logging.getLogger() # 获取日志收集器，默认为root
# log.setLevel("等级")  # 等级必须大写
# logging.basicConfig(level=logging.DEBUG)  # 设置收集器的等级
# 4.日志输出渠道：输出渠道支持输出到文件夹和输出到控制台
# logging.basicConfig()函数中的具体参数
# filename:指定的文件名创建FiledHandler，这样日志会被存储在指定的文件中；
# filemode:文件打开方式，在指定了filename时使用这个参数，默认值为“w”还可指定为“a”；
# format:指定handler使用的日志显示格式；
# datefmt:指定日期时间格式。格式参考strftime时间格式化
# level:设置rootlogger的日志级别
# stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件，默认为sys.stderr。
# 若同时列出了filename和stream两个参数，则stream参数会被忽略。
# 4.1format参数中可能用到的格式化信息：
# %(name)s	Logger的名字
# %(levelno)s	数字形式的日志级别
# %(levelname)s	文本形式的日志级别
# %(pathname)s	调用日志输出函数的模块的完整路径名，可能没有
# %(filename)s	调用日志输出函数的模块的文件名
# %(module)s	调用日志输出函数的模块名
# %(funcName)s	调用日志输出函数的函数名
# %(lineno)d	调用日志输出函数的语句所在的代码行
# %(created)f	当前时间，用UNIX标准的表示时间的浮 点数表示
# %(relativeCreated)d	输出日志信息时的，自Logger创建以 来的毫秒数
# %(asctime)s	字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
# %(thread)d	线程ID
# %(threadName)s	线程名
# %(process)d	进程ID
# %(message)s	用户输出的消息
# 4.2python中时间日期格式化符号
# %y 两位数的年份表示（00-99）
# %Y 四位数的年份表示（000-9999）
# %m 月份（01-12）
# %d 月内中的一天（0-31）
# %H 24小时制小时数（0-23）
# %I 12小时制小时数（01-12）
# %M 分钟数（00=59）
# %S 秒（00-59）
# %a 本地简化星期名称
# %A 本地完整星期名称
# %b 本地简化的月份名称
# %B 本地完整的月份名称
# %c 本地相应的日期表示和时间表示
# %j 年内的一天（001-366）
# %p 本地A.M.或P.M.的等价符
# %U 一年中的星期数（00-53）星期天为星期的开始
# %w 星期（0-6），星期天为星期的开始
# %W 一年中的星期数（00-53）星期一为星期的开始
# %x 本地相应的日期表示
# %X 本地相应的时间表示
# %Z 当前时区的名称
# %% %号本身
# 标准化log输出日志
# 标准化打印输出格式
# 输出的指定文件中
# 控制端输出打印
# 解决不同函数之间调用logging时出现重复打印问题
# 解决不同库之间调用logging时出现重复打印及输出不同log文件中的问题
import logging
import os
import time


def log_test(log_text,log_cate='auto_test'):
    # 创建日志器: logging_name（日志器名，可以随便写），一个日志器可以有多个处理器， 并且每个处理器都可以有自己不同的格式器及过滤器
    logger = logging.getLogger('logging_name')
    # 设置日志输出等级，如果不设置则默认warning级别，也就是只有日志级别为warning或则以上时，才会打印日志，否则不会打印，一般来说需要设置成 debug 打印全部级别
    logger.setLevel(logging.DEBUG)
    # 创建处理器：
    sh = logging.StreamHandler()
    # 创建格式器: 日志时间%(asctime)s、文件名%(filename)s、行%(lineno)d、日志级别%(levelname)s、事件内容%(message)s
    ft = logging.Formatter(fmt='日志时间: %(asctime)s\n文件名: %(filename)s 在第%(lineno)d行\n日志级别: %(levelname)s\n事件内容: %('
                               'message)s\n', datefmt='%Y年%m月%d日 %X')
    # 在日志器中添加处理器
    logger.addHandler(sh)
    #输出到文件中
    #日志文件的时间
    log_time = time.strftime("%Y_%m_%d_%H_%M_%S")
    #日志文件存放的目录
    file_dir = os.path.join(os.getcwd(), '../log')
    if not os.path.exists(file_dir):
        os.mkdir(file_dir)
    log_path=file_dir
    #日志文件全路径
    filename=os.path.join(log_path, log_cate+"_"+log_time + '.log')
    #使用 logging.FileHandler() 函数 在 Python 中将日志写入文件
    handler=logging.FileHandler(filename, encoding="utf-8")
    #使用 addHandler() 函数将此处理程序添加到我们的记录器对象中
    logger.addHandler(handler)
    # 将设置好的格式器添加到处理器中
    sh.setFormatter(ft)
    # 输出日志信息，事件内容需要自己写，这条代码放在哪个文件，错误定位就会显示在哪个文件
    logger.debug(log_time+log_text)
if __name__ == '__main__':
    log_test("log_text")